package documentadorrepositorio.descritoresArtefatos;

import documentadorrepositorio.fabricaArtefatos.FabricaDescritorArtefatos;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author André
 */
public class DescritorUtil {

    private static List<DescritorArtefato> descritores = null;

    public static void reload() throws Exception {

        for (DescritorArtefato descritorArtefato : FabricaDescritorArtefatos.getInstance().obtemDescritoresArtefatos()) {
            descritorArtefato.destroiInstancia();
        }
        descritores = null;
        obtemDescritores();
    }

    public static List<DescritorArtefato> obtemDescritores() throws Exception {
        if (descritores == null) {
            descritores = new ArrayList<>();

            for (DescritorArtefato descritorArtefato : FabricaDescritorArtefatos.getInstance().obtemDescritoresArtefatos()) {
                descritores.add(descritorArtefato);
            }
        }
        return descritores;
    }

    public static Integer obtemNumeroArtefato(String siglaArtefato, String nomeArquivo) {
        String numeroArtefato = "0";
        if (nomeArquivo.toLowerCase().startsWith(siglaArtefato)) {
            nomeArquivo = nomeArquivo.substring(siglaArtefato.length());
        }
        for (int i = 0; i < nomeArquivo.length(); i++) {
            if (Character.isDigit(nomeArquivo.charAt(i))) {
                int j = i;
                char c = nomeArquivo.charAt(j);
                do {
                    numeroArtefato += c;
                    j++;
                    c = nomeArquivo.charAt(j);
                } while (j < nomeArquivo.length() && Character.isDigit(c));
                break;
            }
        }
        return Integer.parseInt(numeroArtefato);
    }

    public static String obtemNomeArtefato(String siglaArtefato, String nomeArquivo) {
        String nomeArtefato = "";
        String nomeArquivoLower = nomeArquivo.toLowerCase();
        if (nomeArquivoLower.startsWith(siglaArtefato.toLowerCase())) {
            nomeArquivo = nomeArquivo.substring(siglaArtefato.length());
        }
        int i = 0;
        for (; i < nomeArquivo.length(); i++) {
            if (Character.isAlphabetic(nomeArquivo.charAt(i))) {
                break;
            }
        }
        if (i < nomeArquivo.length()) {
            nomeArtefato = nomeArquivo.substring(i);
        }
        return nomeArtefato;
    }
//    public static List<Artefato> ordenaArtefatos(List<Artefato> artefatos) {
//        List<Artefato> ne = new ArrayList<>();
//        List<Artefato> rfs = new ArrayList<>();
//        List<Artefato> rnfs = new ArrayList<>();
//        List<Artefato> brs = new ArrayList<>();
//        List<Artefato> hus = new ArrayList<>();
//        List<Artefato> ucs = new ArrayList<>();
//        List<Artefato> guis = new ArrayList<>();
//        List<Artefato> mtzRas = new ArrayList<>();
//
//        for (Artefato art : artefatos) {
//            if (art instanceof Necessidade) {
//                ne.add(art);
//            } else if (art instanceof RequisitoFuncional) {
//                rfs.add(art);
//            } else if (art instanceof RequisitoNaoFuncional) {
//                rnfs.add(art);
//            } else if (art instanceof RegraDeNegocio) {
//                brs.add(art);
//            } else if (art instanceof HistoriaDeUsuario) {
//                hus.add(art);
//            } else if (art instanceof CasoDeUso) {
//                ucs.add(art);
//            } else if (art instanceof Rastreabilidade) {
//                mtzRas.add(art);
//            } else if (art instanceof InterfaceUsuario) {
//                guis.add(art);
//            }
//        }
//
//        List<Artefato> todos = new ArrayList<>();
//        todos.addAll(ne);
//        todos.addAll(rfs);
//        todos.addAll(rnfs);
//        todos.addAll(brs);
//        todos.addAll(hus);
//        todos.addAll(ucs);
//        todos.addAll(guis);
//        todos.addAll(mtzRas);
//
//        return todos;
//
//    }
}
